python导出excel成lua表
1,需安装python 2.7.2
2,程序用到第三方库xlrd,需要另行安装
tool\xls2table.py:
#! /usr/bin/env python # -*- coding: cp936 -*- # convert excel xls file to lua script with table data # date/time values formatted as string, int values formatted as int # depend on xlrd module # fanlix 2008.1.25 # Modify: # 2008.3.18 merged-cell handles: copy data from top-left cell to other cells import xlrd import os.path FLOAT_FORMAT = "%.8f" SCRIPT_HEAD = '''''-- excel xlstable format (sparse 3d matrix) --{ [sheet1] = { [row1] = { [col1] = value, [col2] = value, ...}, -- [row5] = { [col3] = value, }, }, -- [sheet2] = { [row9] = { [col9] = value, }}, --} -- nameindex table --{ [sheet,row,col name] = index, .. } ''' SCRIPT_END = '''''-- functions for xlstable read local __getcell = function (t, a,b,c) return t[a][b][/c] end function GetCell(sheetx, rowx, colx) rst, v = pcall(__getcell, xlstable, sheetx, rowx, colx) if rst then return v else return nil end end function GetCellBySheetName(sheet, rowx, colx) return GetCell(sheetname[sheet], rowx, colx) end ''' def gen_table(filename): if not os.path.isfile(filename): raise NameError, "%s is not a valid filename" % filename book = xlrd.open_workbook(filename,formatting_info=True) luaT = {} luaN = {} sidx = 0 for sheet in book.sheets(): sdict = {} ridx = 0 for ridx in xrange(sheet.nrows): rdict = {} for cidx in xrange(sheet.ncols): value = sheet.cell_value(ridx, cidx) vtype = sheet.cell_type(ridx, cidx) v = format_value(value, vtype, book) #print sidx, ridx, cidx, value, vtype, v if v is not None and value != "": rdict[cidx] = v if rdict: sdict[ridx] = rdict if sdict: luaT[sidx] = sdict # handle merged-cell for crange in sheet.merged_cells: rlo, rhi, clo, chi = crange try: v = sdict[rlo][clo] except KeyError: # empty cell continue if v is None or v == "": continue for ridx in xrange(rlo, rhi): if ridx not in sdict: sdict[ridx] = {} for cidx in xrange(clo, chi): sdict[ridx][cidx] = v name = sheet.name luaN[name] = sidx luaT[sidx] = sdict sidx += 1 #print "--------- luaT:", luaT return luaT, luaN def format_value(value, vtype, book): ''''' format excel cell value, int?date? ''' if vtype == 2: if value == int(value): value = int(value) elif type(value) == float : pass elif vtype == 3: datetuple = xlrd.xldate_as_tuple(value, book.datemode) # time only no date component if datetuple[0] == 0 and datetuple[1] == 0 and datetuple[2] == 0: value = "%02d:%02d:%02d" % datetuple[3:] # date only, no time elif datetuple[3] == 0 and datetuple[4] == 0 and datetuple[5] == 0: value = "%04d/%02d/%02d" % datetuple[:3] else: # full date value = "%04d/%02d/%02d %02d:%02d:%02d" % datetuple return value def format_output(v): s = ("%s"%(v)).encode("gbk") if s[-1] == "]": s = "%s "%(s) return s def write_table(luaT, luaN, outfile = '-', withfunc = True): ''''' lua table key index starts from 1 ''' if outfile and outfile != '-': outfp = open(outfile, 'w') outfp.write(SCRIPT_HEAD) else: import StringIO outfp = StringIO.StringIO() outfp.write("sheetname = {\n") for k,v in luaN.iteritems(): outfp.write("[\"%s\"] = %d,\n"%(format_output(k), v + 1)) outfp.write("};\n\n") outfp.write("sheetindex = {\n") for k, v in luaN.iteritems(): outfp.write("[%d] = \"%s\",\n" %(v+1, format_output(k))) outfp.write("};\n\n") outfp.write("xlstable = {\n") for sidx, sheet in luaT.iteritems(): outfp.write("[%d] = {\n"%(sidx + 1)) for rowidx, row in sheet.iteritems(): outfp.write("\t[%d] = {\n"%(rowidx + 1)) for colidx, col in row.iteritems(): try: if type(col) is int: s = "%d"%(col) elif type(col) is float: s = FLOAT_FORMAT%(col) else : s = "[[%s]]"%(format_output(col)) outfp.write("\t\t[%d] = %s,\n"%(colidx + 1, s)) except Exception, e: raise Exception("Write Table error (%s,%s,%s) : %s"%(sidx+1,rowidx+1,colidx+1,str(e))) outfp.write("\t},\n") outfp.write("},\n") outfp.write("};\n\n") if withfunc: outfp.write(SCRIPT_END) outfp.write("\n__XLS_END = true\n") if not outfile or outfile == '-': outfp.seek(0) print outfp.read() outfp.close() def main(): import sys if len(sys.argv) sys.exit('''''usage: filename outputfile('-' for stdout by default)''') filename = sys.argv[1] try: output = sys.argv[2] except: output = '-' t, n = gen_table(filename) write_table(t, n, output, withfunc = True) if __name__=="__main__": main()
tool/test.lua:
function ParseTable(table) local CodeString = "--玩家道具\n local autoTable = {\n" for line, Data in ipairs(table[1]) do --只读第一页 --第一行不读 if line > 1 then CodeString = CodeString .. string.format("\t[%d] = {\n", Data[1]) CodeString = CodeString .. string.format("\t\ttype = 'voucher',\n") CodeString = CodeString .. string.format("\t\tareaType = 'other',\n") CodeString = CodeString .. string.format("\t\tname = '%s',\n", Data[3]) CodeString = CodeString .. string.format("\t\tdescribe = '%s',\n", Data[4]) if Data[5] then CodeString = CodeString .. string.format("\t\teffect = '%s',\n", Data[5]) end CodeString = CodeString .. "\t},\n" end end CodeString = CodeString .. "}\n" CodeString = CodeString .. "function GetTable()\n\treturn autoTable\nend\n" return CodeString end function SaveCode(file, Code) local fd = io.open(file, "w") assert(fd) fd:write(Code) fd:close() end function gen() local excelfile = "excel/ping-zheng.xls" local outfile = "autocode/voucher.lua" local cmd = string.format([python 'tool/xls2table.py' '%s'], excelfile) local fd = io.popen(cmd) local loadxls = loadstring(fd:read("*a")) assert(loadxls) loadxls() assert(__XLS_END) fd:close() local Code = ParseTable(xlstable) SaveCode(outfile, Code) end gen()